// 信号代码
#include <iostream>
using namespace std;
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <signal.h>
#include <cassert>
void Print(sigset_t &pending)
{
    cout << "pending bitmap:";
    for (int signum = 31; signum > 0; signum--)
    {
        if (sigismember(&pending, signum))
        {
            cout << "1";
        }
        else
        {
            cout << "0";
        }
    }
    cout << endl;
}
void handler(int signo)
{
    cout << "收到了" << signo << "号信号" << endl;
    cout << "递达中......:";
    // 获取pending位图
    sigset_t pending;
    sigemptyset(&pending);
    int n = sigpending(&pending);
    assert(n == 0);
    (void)n;
    // 打印pending位图
    Print(pending); // 不可直接打印sigset_t对象
    sleep(1);
}
int main()
{
    signal(2, handler);
    cout << "pid:" << getpid() << endl;
    // 屏蔽2号信号
    sigset_t block, oblock;
    sigemptyset(&block);
    sigemptyset(&oblock);
    sigaddset(&block, 2);
    int n = sigprocmask(SIG_SETMASK, &block, &oblock);
    cout << "屏蔽信号成功" << endl;
    assert(n == 0);
    (void)n;

    int count = 0;

    while (true)
    {
        // 获取pending位图
        sigset_t pending;
        sigemptyset(&pending);
        n = sigpending(&pending);
        assert(n == 0);
        (void)n;
        // 打印pending位图
        Print(pending); // 不可直接打印sigset_t对象
        sleep(1);
        count++;

        // 10s之后，向该进程发送2号信号
        if (count == 10)
        {
            kill(getpid(), 2);
        }

        // 20s之后解除2号信号
        if (count == 20)
        {
            n = sigprocmask(SIG_UNBLOCK, &block, &oblock);
            assert(n == 0);
            (void)n;
        }
    }
    return 0;
}

// int main()
// {
//     int a = 10;
//     a /= 0;
//     return 0;
// }

// int main()
// {
//     pid_t id = fork();
//     if (id == 0)
//     {
//         sleep(1);
//         int a = 10;
//         a /= 0;
//         exit(0);
//     }
//     int status = 0;
//     pid_t rid = waitpid(id, &status, 0);
//     if (rid > 0)
//     {
//         cout << "退出码:" << ((status >> 8) & 0xFF) << endl;
//         cout << "退出信号:" << (status & 0x7F) << endl;
//         cout << "core dump:" << ((status >> 7) & 0x1) << endl;
//     }
//     return 0;
// }

// void handler(int a)
// {
//     cout << "我接受到的信号是:" << a << "号信号" << endl;
// }
// int main()
// {
//     int cnt = 0;
//     signal(2, handler);

//     while (1)
//     {
//         cout << "cnt:" << cnt << endl;
//         cnt++;
//         if (cnt % 5 == 0)
//         {
//             raise(2);
//         }
//         sleep(1);
//     }

//     return 0;
// }

// // ./my_exe -sig pid
// int main(int argc, char *argv[])
// {
//     if (argc != 3)
//     {
//         cerr << "使用规范:" << argv[0] << " -signal pid" << endl;
//         exit(1);
//     }
//     // 拿到信号
//     int my_signal = stoi(argv[1] + 1);
//     // 拿到pid
//     pid_t my_pid = stoi(argv[2]);

//     int n = kill(my_pid, my_signal);
//     if (n < 0)
//     {
//         cerr << "kill 失败" << endl;
//     }

//     return 0;
// }

// void handler(int a)
// {
//     cout << "我是修改了的信号" << endl;
// }
// int main()
// {
//     // signal(SIGINT, handler); // handler(SIGINT)----->捕捉
//     signal(SIGINT, SIG_IGN); // 忽略
//     while (1)
//     {
//         cout << "我是一个正在运行的进程,我的pid是:" << getpid() << endl;
//         sleep(1);
//     }
//     return 0;
// }